<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //1.任何程序设计语言都有作用域的概念，简单的说，作用域就是变量与函数的可访问范围，即作用域控制着变量与函数的可见性和生命周期。
    //全局作用域：整个程序都有效，即整个代码中都可以调用。
    //局部作用域：只对函数内部有效，即只能在本变量声明的函数内部调用。

    // alert(num); //undefined
    // var num = 1; //全局
    // alert(num); //1

    // function fn() {
    //     var hehe = 250; //局部
    //     console.log(num); //1
    //     console.log(hehe);
    // }
    // fn();
    // console.log(hehe); //X 报错了，这里无法找到hehe这个变量。


    // for (var i = 1; i <= 10; i++) { //i:全局

    // }
    // console.log(i); //11



    //总结：函数是半透明的，看到外面，外面看不到函数里面。
    // var a = 1; //全局
    // function fn() {
    //     var b = 2; //局部
    //     console.log(a); //1
    //     console.log(b); //2
    // }
    // fn();
    // console.log(a); //1
    // console.log(b); //报错

    //2.作用域的特殊性
    //如果函数内部的变量，声明变量的时候，忘记了添加var，不但不报错，反而会将此变量当做全局变量。
    // function fn() {
    //     a = 1; //声明变量，没有var关键字，改变变量的作用域。变成全局
    //     console.log(a);
    // }
    // fn();
    // console.log(a);
    // var a = 10;

    // function fn() {
    //     a = 1; //重新定义，改变变量的值。
    //     console.log(a); //1
    // }
    // fn();
    // console.log(a); //1


    //3.作用域链 - 内-外
    //通俗地讲，当声明一个函数时，局部作用域一级一级向上包起来，就是作用域链。
    //当执行函数时，总是先从函数内部找寻局部变量,如果内部找不到（函数的局部作用域没有），则会向上一级继续查找，一直找到最外面。
    //在函数体内，局部变量的优先级高于同名的全局变量-作用域链。
    // var num = 0; //全局
    // function fn1() {
    //     var num = 1; //局部
    //     function fn2() { //局部
    //         var num = 2;
    //         console.log(num); //2
    //     }
    //     fn2();
    // }
    // fn1();
</script>